package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.CheckGroupDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.pojo.CheckGroup;
import com.itheima.health.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author likepei
 * @Date 2020/3/28 23:43
 * @Version v1.0
 * @Description 检查组业务接口实现类
 */
@Transactional
@Service
public class CheckGroupServiceImpl implements CheckGroupService {

    //依赖注入
    @Autowired
    private CheckGroupDao checkGroupDao;

    /**
     * 分页查询
     * @param queryPageBean 前端页面发过来的数据( 当前页码, 每页条数, 查询条件)
     * @return 结果( 总记录数, 当前页要显示的10条检查组数据  )
     */
    @Override
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        //设置分页插件初始参数
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //通过Dao获取Page对象
        Page<CheckGroup> page = checkGroupDao.selectByCondition(queryPageBean.getQueryString());
        //通过Page对象，构建PageResult
        PageResult pageResult = new PageResult(page.getTotal(), page.getResult());

        return pageResult;
    }

    /**
     * 添加检查组
     * @param checkGroup 前端页面传递过来的新增检查组的表单数据
     * @param checkitemIds 前端页面传递过来的新增检查组所关联的检查项ID
     */
    @Override
    public void add(CheckGroup checkGroup, Integer[] checkitemIds) {
        //保存新增的检查组信息
        checkGroupDao.add(checkGroup);
        //保存新增检查组 与 勾选的检查项 , 保存到中间表里 t_checkgroup_checkitem
        //遍历检查项Id的数组, 得到每一个检查项id
        for (Integer checkitemId : checkitemIds) {
            //创建Map集合 用于存储本次sql语句的 新增检查组id 与 当前的检查项Id
            Map<String, Integer> map = new HashMap<>();
            map.put("checkgroup_id", checkGroup.getId());
            map.put("checkitem_id", checkitemId);

            //把新增检查组id 与 当前的检查项Id 保存到中间表
            checkGroupDao.addCheckGroupAndCheckItem(map);
        }
    }

    /**
     * 基于检查组id  查询 检查组对象
     * @param id 检查组id
     * @return
     */
    @Override
    public CheckGroup findById(Integer id) {
        //调用dao层 findById方法, 获取检查组对象
        return checkGroupDao.findById(id);
    }

    /**
     * 基于检查组Id 查询关联的检查项id
     * @param id 检查组Id
     * @return
     */
    @Override
    public List<Integer> findCheckItemIdsByCheckGroupId(Integer id) {
        //调用dao层 findCheckItemIdsByCheckGroupId, 获取检查项ID
        return checkGroupDao.findCheckItemIdsByCheckGroupId(id);
    }

    /**
     * 更新检查组
     * @param checkGroup 前端页面传递过来的新增检查组的表单数据
     * @param checkItemIds 前端页面传递过来的新增检查组所关联的检查项ID
     */
    @Override
    public void edit(CheckGroup checkGroup, Integer[] checkItemIds) {
        //更新检查组信息
        checkGroupDao.edit(checkGroup);
        //删除检查组 旧的依赖关系( 检查组与勾选的检查项的关系 [从中间表删除数据] )
        checkGroupDao.deleteCheckGroupAndCheckItem(checkGroup.getId());
        //重新 建立新的检查组的依赖关系( 检查组与勾选的检查项的关系[从中间表添加数据] )
        for (Integer checkItemId : checkItemIds) {
            //建立Map集合, 用于保存每一次sql执行时 用到的 检查组ID与 检查项ID
            Map<String, Integer> map = new HashMap<>();
            map.put("checkgroup_id", checkGroup.getId());
            map.put("checkitem_id", checkItemId);

            checkGroupDao.addCheckGroupAndCheckItem(map);
        }
    }

    /**
     * 查询所有的检查组信息
     * @return
     */
    @Override
    public List<CheckGroup> findAll() {
        //调用dao层的findAll方法
        return checkGroupDao.findAll();
    }

}
